package com.java.method_reference;

import java.util.stream.Stream;

/**
 * 方法引用的各种方式
 */
public class MethodReferenceUse {
    static class Parent {
        public Integer reference(String str) {
            return Integer.parseInt(str + str + str);
        }
    }

    static class Child extends Parent {
        private String name;

        public Child() {
        }

        public Child(String name) {
            this.name = name;
        }

        @Override
        public Integer reference(String str) {
            return Integer.parseInt(str + str);
        }

        public static Integer referenceStatic(String str) {
            return Integer.parseInt(str + str);
        }

        public void referenceThisAndSuper() {
            // 非静态成员方法：this::非静态成员方法
            Stream.of("1", "2", "3", "4")
                    .map(this::reference)
                    .forEach(System.out::print); // 11223344
            System.out.println();

            // 非静态成员方法：super::非静态成员方法
            Stream.of("1", "2", "3", "4")
                    .map(super::reference)
                    .forEach(System.out::print); // 111222333444
            System.out.println();
        }

        @Override
        public String toString() {
            return "Child" + name + " ";
        }
    }

    public static void main(String[] args) {
        // 构造函数：类名::new
        Stream.of("1", "2", "3", "4")
                .map(Child::new)
                .forEach(System.out::print); // Child1 Child2 Child3 Child4
        System.out.println();

        // 构造函数：数据类型[]::new
        String[] array = Stream.of("1", "2", "3", "4")
                .toArray(String[]::new);
        System.out.println(array.length); // 4

        // 静态方法：类名::静态方法
        Stream.of("1", "2", "3", "4")
                .map(Child::referenceStatic)
                .forEach(System.out::print); // 11223344
        System.out.println();

        // 非静态成员方法：对象名::非静态成员方法
        Child child = new Child();
        Stream.of("1", "2", "3", "4")
                .map(child::reference)
                .forEach(System.out::print); // 11223344
        System.out.println();

        // 非静态成员方法：this::非静态成员方法、super::非静态成员方法
        child.referenceThisAndSuper();
    }
}
